package com.example.blog.modules.system.service;

import com.example.blog.modules.system.dto.DashboardDTO;
import com.example.blog.common.validation.DateRange;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import org.springframework.core.io.Resource;
import org.springframework.validation.annotation.Validated;

import java.time.LocalDate;

@Validated
public interface DashboardService {
    /**
     * 获取仪表盘数据
     */
    DashboardDTO getDashboardData();

    /**
     * 获取指定时间范围的仪表盘数据
     */
    DashboardDTO getDashboardData(
        @NotNull(message = "开始日期不能为空") 
        @DateRange(maxDays = 90) LocalDate startDate,
        @NotNull(message = "结束日期不能为空") LocalDate endDate);
    
    /**
     * 获取趋势数据（无起始日期版本）
     */
    DashboardDTO getTrendData(@Min(1) @Max(90) int days);

    /**
     * 获取趋势数据（带起始日期）
     */
    DashboardDTO getTrendData(
        @Min(1) @Max(90) int days,
        @NotNull(message = "开始日期不能为空") LocalDate startDate);
    
    /**
     * 获取热门分类
     */
    DashboardDTO getTopCategories(@Min(1) @Max(50) int limit);
    
    /**
     * 获取热门标签
     */
    DashboardDTO getTopTags(@Min(1) @Max(50) int limit);
    
    /**
     * 导出仪表盘数据
     */
    Resource exportDashboardData(
        @NotNull(message = "开始日期不能为空") 
        @DateRange(maxDays = 90) LocalDate startDate,
        @NotNull(message = "结束日期不能为空") LocalDate endDate,
        @NotNull(message = "导出格式不能为空") String format);

    /**
     * 导出趋势数据
     */
    Resource exportTrendData(
        @Min(1) @Max(90) int days,
        @NotNull(message = "开始日期不能为空") LocalDate startDate,
        @NotNull(message = "导出格式不能为空") String format);

    /**
     * 导出热门分类数据
     */
    Resource exportTopCategories(
        @Min(1) @Max(50) int limit,
        @NotNull(message = "导出格式不能为空") String format);

    /**
     * 导出热门标签数据
     */
    Resource exportTopTags(
        @Min(1) @Max(50) int limit,
        @NotNull(message = "导出格式不能为空") String format);
} 